import { ref, onMounted, onUnmounted } from 'vue'

// 主音频播放器对象（讲解音频）
let audioPlayer = null

// 背景音乐播放器对象
let bgmPlayer = null

// 当前播放的VR项目
let currentPlayingItem = null

// 当前播放的背景音乐项目
let currentBgmItem = null

// 创建音频播放状态的ref，以便在组件中响应式地使用
export const audioPlaying = ref(false)
export const bgmPlaying = ref(false)

export default {
  // 播放VR项的MP3音频（讲解音频）
  playVrAudio(item) {
    this.stopVrAudio()
    
    if (!item || !item.mp3Url) {
      return
    }
    
    console.log('播放讲解音频: ' + item.mp3Url)
    audioPlayer = new Audio(item.mp3Url)
    currentPlayingItem = item
    audioPlayer.loop = true
    audioPlayer.volume = 0.9  // 讲解音频音量设置为0.9
    
    // 音频错误处理
    audioPlayer.onerror = function(error) {
      console.error('讲解音频播放错误: ', error)
      audioPlayer = null
      currentPlayingItem = null
      audioPlaying.value = false
    }
    
    // 音频播放开始事件
    audioPlayer.onplay = function() {
      console.log('讲解音频开始播放')
      audioPlaying.value = true
    }
    
    // 音频暂停事件
    audioPlayer.onpause = function() {
      console.log('讲解音频暂停')
      audioPlaying.value = false
    }
    
    // 尝试播放音频并处理可能的错误
    return audioPlayer.play().catch(error => {
      console.error('讲解音频自动播放失败，需要用户交互: ', error)
      audioPlayer = null
      // 如果自动播放失败，返回一个标记表示需要用户交互
      return { requiresUserInteraction: true, item }
    })
  },
  
  // 播放背景音乐
  playBgm(item) {
    this.stopBgm()
    
    if (!item || !item.bgm) {
      return
    }
    
    console.log('播放背景音乐: ' + item.bgm)
    bgmPlayer = new Audio(item.bgm)
    currentBgmItem = item
    bgmPlayer.loop = true
    bgmPlayer.volume = 0.15  // 背景音乐音量调低至15%，突出讲解音频
    
    // 背景音乐错误处理
    bgmPlayer.onerror = function(error) {
      console.error('背景音乐播放错误: ', error)
      bgmPlayer = null
      currentBgmItem = null
      bgmPlaying.value = false
    }
    
    // 背景音乐播放开始事件
    bgmPlayer.onplay = function() {
      console.log('背景音乐开始播放')
      bgmPlaying.value = true
    }
    
    // 背景音乐暂停事件
    bgmPlayer.onpause = function() {
      console.log('背景音乐暂停')
      bgmPlaying.value = false
    }
    
    // 尝试播放背景音乐并处理可能的错误
    return bgmPlayer.play().catch(error => {
      console.error('背景音乐自动播放失败，需要用户交互: ', error)
      bgmPlayer = null
      // 如果自动播放失败，返回一个标记表示需要用户交互
      return { requiresUserInteraction: true, item }
    })
  },
  
  // 停止当前音频播放
  stopVrAudio() {
    if (audioPlayer) {
      audioPlayer.pause()
      audioPlayer = null
      currentPlayingItem = null
      audioPlaying.value = false
    }
  },
  
  // 停止背景音乐播放
  stopBgm() {
    if (bgmPlayer) {
      bgmPlayer.pause()
      bgmPlayer = null
      currentBgmItem = null
      bgmPlaying.value = false
    }
  },
  
  // 停止所有音频播放
  stopAllAudio() {
    this.stopVrAudio()
    this.stopBgm()
  },
  
  // 切换音频播放状态
  toggleAudioPlayback(currentItem = null) {
    if (audioPlayer) {
      if (audioPlayer.paused) {
        return audioPlayer.play().catch(error => {
          console.error('讲解音频播放失败: ', error)
          // 如果是因为用户未交互导致的失败，返回一个标记
          if (error.name === 'NotAllowedError') {
            return { requiresUserInteraction: true, item: currentPlayingItem || currentItem, isBgm: false }
          } else {
            alert('讲解音频播放失败，请稍后再试')
            return Promise.reject(error)
          }
        })
      } else {
        audioPlayer.pause()
        return Promise.resolve()
      }
    } else {
      // 如果没有音频播放器实例，尝试创建并播放当前VR项的音频
      const item = currentItem || currentPlayingItem
      if (item && item.mp3Url) {
        return this.playVrAudio(item)
      }
    }
  },
  
  // 切换背景音乐播放状态
  toggleBgmPlayback(currentItem = null) {
    if (bgmPlayer) {
      if (bgmPlayer.paused) {
        return bgmPlayer.play().catch(error => {
          console.error('背景音乐播放失败: ', error)
          // 如果是因为用户未交互导致的失败，返回一个标记
          if (error.name === 'NotAllowedError') {
            return { requiresUserInteraction: true, item: currentBgmItem || currentItem }
          } else {
            alert('背景音乐播放失败，请稍后再试')
            return Promise.reject(error)
          }
        })
      } else {
        bgmPlayer.pause()
        return Promise.resolve()
      }
    } else {
      // 如果没有背景音乐播放器实例，尝试创建并播放当前VR项的背景音乐
      const item = currentItem || currentBgmItem
      if (item && item.bgm) {
        return this.playBgm(item)
      }
    }
  },
  
  // 同时切换讲解音频和背景音乐的播放状态
  toggleAllPlayback(currentItem = null) {
    const item = currentItem || currentPlayingItem || currentBgmItem
    
    if (audioPlaying.value || bgmPlaying.value) {
      // 如果任一音频正在播放，则暂停所有音频但不销毁实例
      if (audioPlayer && !audioPlayer.paused) {
        audioPlayer.pause()
      }
      if (bgmPlayer && !bgmPlayer.paused) {
        bgmPlayer.pause()
      }
      return Promise.resolve()
    } else {
      // 如果所有音频都已停止，则尝试继续播放或创建新实例
      const promises = []
      
      if (audioPlayer && currentPlayingItem && currentPlayingItem.mp3Url) {
        // 如果已有播放器实例，继续播放
        promises.push(audioPlayer.play().catch(error => {
          console.error('恢复讲解音频播放失败: ', error)
          // 如果继续播放失败，尝试创建新实例
          if (item && item.mp3Url) {
            return this.playVrAudio(item)
          }
          return Promise.resolve()
        }))
      } else if (item && item.mp3Url) {
        // 如果没有播放器实例，创建新实例播放
        promises.push(this.playVrAudio(item))
      }
      
      if (bgmPlayer && currentBgmItem && currentBgmItem.bgm) {
        // 如果已有背景音乐播放器实例，继续播放
        promises.push(bgmPlayer.play().catch(error => {
          console.error('恢复背景音乐播放失败: ', error)
          // 如果继续播放失败，尝试创建新实例
          if (item && item.bgm) {
            return this.playBgm(item)
          }
          return Promise.resolve()
        }))
      } else if (item && item.bgm) {
        // 如果没有背景音乐播放器实例，创建新实例播放
        promises.push(this.playBgm(item))
      }
      
      return Promise.all(promises).then(results => {
        // 检查是否有需要用户交互的结果
        const interactionRequired = results.find(result => result && result.requiresUserInteraction)
        return interactionRequired || Promise.resolve()
      })
    }
  },
  
  // 获取当前播放的音频项
  getCurrentPlayingItem() {
    return currentPlayingItem
  },
  
  // 获取音频播放器实例
  getAudioPlayer() {
    return audioPlayer
  }
}